iT邦幫忙

0

[Golang]同步工具-sync包的WaitGroup-心智圖總結

  • 分享至 

  • xImage
  •  

1. WaitGroup類型有三個指針方法,Add、Done、Wait
A. 這個類型提供ㄧ個計數器,默認值為0。
B. ㄧ般情況下,會用這個方法來紀錄需要等待的goroutine的數量。
C. 通過該類型的Add方法來增加,或者減少計數器的值。
D. Done方法的功能是,對計數器的值進行減ㄧ的操作。
可以在需要等待的goroutine中,通過defer語句調用它
E. Wait方法的功能是,阻塞當前的goroutine,直到其所屬值中的計數器歸零。
如果Wait方法被調用的時候,計數器的值就是0,它就不會做任何事情。
F. sync.WaitGroup類型計數器的值,不可以小於0

2. 範例程式碼

package main

import (
	"fmt"
	"sync"
	"sync/atomic"
	"time"
)

func main() {
  coordinateWithWaitGroup()
}

func coordinateWithWaitGroup() {
  var wg sync.WaitGroup
  wg.Add(2) // 對計數器加2。後面建立兩個 goroutine。

  num := int32(0)
  max := int32(10)
  fmt.Printf("The number: %d\n", num)

  // 建立兩個 goroutine,對num進行原子操作
  go addNum(&num, 1, max, wg.Done)
  go addNum(&num, 2, max, wg.Done)
  wg.Wait() // 阻塞在這裡,等待兩個 goroutine 執行結束。
}

// addNum 對numP所指向的變數值,進行原子操作。
func addNum(numP *int32, id, max int32, deferFunc func()) {
  defer func() {
    deferFunc()
  }()
  for i := 0; ; i++ {
    currNum := atomic.LoadInt32(numP)
    if currNum >= max {
      break
    }

    newNum := currNum + 2
    time.Sleep(time.Millisecond * 200)
    if atomic.CompareAndSwapInt32(numP, currNum, newNum) {
      fmt.Printf("The number: %d [%d-%d]\n", currNum, id, i)
    } else {
      fmt.Printf("The CAS operation failed. [%d-%d]\n", id, i)
    }
  }
}

https://play.golang.org/p/qbTXsQJbaon

https://ithelp.ithome.com.tw/upload/images/20201201/20131728EfbESANP4l.png

參考來源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言